package com.projetosi.web.server.sistema.sistema;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import com.projetosi.web.server.sistema.interfaces.IGenericObject;
import com.projetosi.web.server.sistema.objetos.Emprestimo;
import com.projetosi.web.server.sistema.objetos.Item;
import com.projetosi.web.server.sistema.objetos.Usuario;
import com.projetosi.web.server.sistema.persistencia.LerEscreveArquivo;
/**
 * Classe responsavel por conter todas as listas de objetos cadastrados no sistema. Implementa o padrao Singleton ja
 * que eh necessario uma unica instancia do repositorio de dados.
 * 
 * @author Filipe Alencar, Felipe Jose Cavalcanti, Rodrigo L. de Brito, Thiago Goncalves, Victor Hugo Arcelino.
 *
 */
public class RepositorioDeDados {
	
	private static RepositorioDeDados _repositorio;
	
	private List<Usuario> usuarios;
	private List<Item> itens;
	private List<Emprestimo> emprestimos;
	
	
	private RepositorioDeDados(){
		usuarios = new ArrayList<Usuario>();
		itens = new ArrayList<Item>();
		emprestimos = new ArrayList<Emprestimo>();
		
	}
	/**
	 * Garante que uma unica instancia da classe ser� criada.
	 * @return O repositorio de dados.
	 */
	public static RepositorioDeDados getInstance(){
		if(_repositorio == null) 
			_repositorio = new RepositorioDeDados();  
		return _repositorio;
	}
	
	/**
     * Retorna os itens cadastrados no sistema.
     * @return Lista de itens cadastrados no sistema.
     */
	public List<Item> getItens() {
		return itens;
	}
	/**
	 * Retorna os usuarios cadastrados no sistema.
	 * @return Lista de usuarios cadastrados.
	 */
	public List<Usuario> getUsuarios() {
		return usuarios;
	}
	
	/**
	 * Retorna os emprestimos realizados e guardados no sistema.
	 * @return Lista de emprestimos realizados.
	 */
	public List<Emprestimo> getEmprestimos() {
		return emprestimos;
	}
	
	/**
     * Define uma nova lista de itens adicionados ao sistema.
     * @param pessoas Nova lista de itens.
     */
	public void setItens(List<Item> itens) {
		this.itens = itens;
	}
	
	/**
     * Define uma nova lista de usuarios adicionados ao sistema.
     * @param pessoas Nova lista de usuarios.
     */
	public void setUsuarios(List<Usuario> usuarios) {
		this.usuarios = usuarios;
	}
	
	/**
	 * Define uma nova lista de emprestimos.
	 * @param emprestimos Nova lista de emprestimos.
	 */
	public void setEmprestimos(List<Emprestimo> emprestimos) {
		this.emprestimos = emprestimos;
	}
	
	/**
	 * Zera o repositorio de dados.
	 */
	public void zerarRepositorio(){
		_repositorio = new RepositorioDeDados();
	}
	 
	/**
     * Salva dados em um certo arquivo.
     * @param arquivo O arquivo onde os dados serao salvos.
     * @throws DAOException Se nao for possivel salvar os dados no arquivo.
     */
    public void atualizarDados(File arquivo) throws Exception{
        if(arquivo.equals(new File("emprestimos.xml"))){
            try {
                LerEscreveArquivo.salvarObjeto(getEmprestimos(), arquivo);
            } catch (IOException ex) {
                 throw new Exception("Erro na base de arquivos. Tente novamente ou informe ao administrador do sistema");
            }
        }else if(arquivo.equals(new File("itens.xml"))){
            try {
                LerEscreveArquivo.salvarObjeto(getItens(), arquivo);
            } catch (IOException ex) {
                 throw new Exception("Erro na base de arquivos. Tente novamente ou informe ao administrador do sistema");
            }
        }else if(arquivo.equals(new File("usuarios.xml"))){
            try {
                LerEscreveArquivo.salvarObjeto(getUsuarios(), arquivo);
            } catch (IOException ex) {
                throw new Exception("Erro na base de arquivos. Tente novamente ou informe ao administrador do sistema");
            }
        }
       
    }
    
    /**
     * Ler todos os dados de um certo arquivo.
     * @param <T> O tipo de objetos que a List salva no arquivo contem.
     * @param arquivo O arquivo a ser lido.
     * @return A List salva no arquivo.
     * @throws DAOException Se nao for possivel ler o arquivo.
     */
    public <T extends IGenericObject> List<T> carregarDados(File arquivo) throws Exception {
        List<T> lista = null;
        try {
            lista = LerEscreveArquivo.lerArquivo(arquivo);
        } catch (IOException ex) {
            throw new Exception("Erro na base de arquivos. Tente novamente ou informe ao administrador do sistema");
        }
        return lista;
    }
}
